/*******************************************************************************
* FileName:         SeqList.cpp
* Author:           李智铭
* Student Number:   302206093
* Date:             2024.10.09
* Version:          v1.0
* Description:      Data Structure Experiment #1
*                   作业在这个文件中完成，需要补全SeqList类的实现，
*                   给出了构造函数与析构函数的例子.
*                   写明必要的注释
*******************************************************************************/

#include "SeqList.h"

/*
    使用初始化列表来初始化const变量LIST_SIZE，
    并动态分配LIST_SIZE长度的数组。
*/
SeqList::SeqList(const int& listSize) :LIST_SIZE(listSize)
{
    seq = new int[LIST_SIZE];
    // equal to:  seq = (int*) malloc(sizeof(int) * LIST_SIZE);
    len = 0;
}

SeqList::~SeqList(){
    delete[] seq;
}

bool SeqList::isIn(const int& data){
    for(int i = 0 ; i < len ; i++){    //顺序查找数组中的元素
        if(data == seq[i])
            return true;
    }
    return false;
}

int SeqList::length(){
    return len;    //返回表长
}

int SeqList::getData(const int& location){
    if(location < 0 || location >= len)
        return -1;     //处理异常情况
    return seq[location];    //返回指定位置的元素
}

bool SeqList::insert(const int& data, const int& location){
    if(len == LIST_SIZE) return false;     //判断是否表满并返回false
    else if(isIn(data)) return true;      //判断此元素是否在表中并返回true
    if (location < 0 || location > len) return false;  // 防止非法的location

    for(int k = len - 1 ; k >= location ; k--)  seq[k+1] = seq[k];   //将位置location及之后的元素后移
    seq[location] = data;     //赋值元素
    len++;      //表长+1
    return true;
}

bool SeqList::remove(const int& location){
    if(location < 0 || location >= len)  return false;     //判断location是否合法
    for(int i = location ; i < len - 1 ; i++) seq[i] = seq[i+1];     //将位置location及之后的元素前移
    len--;     //表长-1
    return true;
}
